import {
    BufferGeometry, BufferAttribute,
    PointsMaterial,
    Points,
    LineBasicMaterial, Line, LineLoop, LineSegments,
    MeshBasicMaterial,
    Mesh,
    DoubleSide,
    FrontSide,
    BackSide,
    MeshLambertMaterial,
    Group,
    Vector3
} from 'three'

const geometry = new BufferGeometry()

// 添加顶点数据，通过类型化数组创建顶点数据
const vertices = new Float32Array([
    0, 0, 0,  // 顶点坐标 1
    80, 0, 0, // 顶点坐标 2
    80, 80, 0,    // 顶点坐标 3

    // 0, 0, 0, // 顶点坐标 4
    // 80, 80, 0,    // 顶点坐标 5
    0, 80, 0 // 顶点坐标 6
])

// 定义顶点索引,得使用Uint16Array类型定义
const indexes = new Uint16Array([
    0, 1, 2, 0, 2, 3
])


// 创建属性缓冲对象
// 3个为一组，表示一个顶点的xyz坐标
const attribue = new BufferAttribute(vertices, 3)

// 设置几何体的顶点位置属性
geometry.attributes.position = attribue

// 将顶点索引绑定到几何体中,参数一为定义的索引顶点，参数二为固定值
geometry.index = new BufferAttribute(indexes, 1)

// 创建顶点法向量坐标
const norlmals = new Float32Array([
    0, 0, 1,  // 顶点坐标 1顶点法向量
    80, 0, 1, // 顶点坐标 2顶点法向量
    80, 80, 1,    // 顶点坐标 3顶点法向量

    0, 80, 1 // 顶点坐标 6顶点法向量
])

// 绑定顶点法向量
geometry.attributes.norlmals = new BufferAttribute(norlmals, 3)

// 创建一个网格质
const material = new MeshLambertMaterial({
    color: 0xffff00,
    side: DoubleSide  // 单面可见FrontSide, 双面可见DoubleSide，BackSide反面背面可见
})



// 创建一个点模型对象,使用其他的线模型可以在这里直接替换LineLoop、LineSegments
const mesh1 = new Mesh(geometry, material) 
const mesh2 = new Mesh(geometry, material) 
mesh2.position.z = 50
const group = new Group()
group.add(mesh1,mesh2)

// 隐藏模型显示
mesh2.visible = false
// 创建一个三维向量表示坐标
const v3 = new Vector3()
mesh1.getWorldPosition(v3)
// 打印mesh1的世界坐标
console.log(v3)

// 递归遍历所有的模型节点
group.traverse(function(obj) {
    console.log('obj',obj)
})
export default group